package com.woniu108.order.service;


import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.woniu108.order.model.dto.OrderProductDto;
import com.woniu108.order.model.form.OrderProductUpdateReviewStateForm;
import com.woniu108.order.model.model.OrderProduct;
import com.woniu108.order.model.param.OrderProductCancelParam;
import com.woniu108.order.model.param.OrderProductCreateParam;
import com.woniu108.order.model.param.OrderProductUpdateAddressParam;
import com.woniu108.order.model.param.QueryOrderProductConditionParam;

import java.util.Map;

/**
 * <p>
 * 商品订单表 服务类
 * </p>
 *
 * @author yanxi
 * @since 2024-05-23
 */
public interface OrderProductService extends IService<OrderProduct> {

    /**
     * 按条件查询订单信息（管理员）
     * @param param 查询条件
     * @return 分页后订单信息
     */
    Page<OrderProductDto> selectOrderByConditionToManager(QueryOrderProductConditionParam param);

    /**
     * 按条件查询订单信息
     * @param param 查询条件
     * @return 分页后订单信息
     */
    Page<OrderProductDto> selectOrderByCondition(QueryOrderProductConditionParam param);

    /**
     * 按订单编号精确查询订单信息
     * @param orderNum 订单编号
     * @return 订单信息
     */
    OrderProductDto selectOneOrderByOrderNum(String orderNum);

    /**
     * 按订单编号取消未支付的订单
     * @param param 订单编号，理由
     */
    void cancelOrderByOrderNum(OrderProductCancelParam param);

    /**
     * 按订单编号修改未发货的订单的收货地址
     * @param param 订单编号，地址id
     */
    void updateAddressByOrderProduct(OrderProductUpdateAddressParam param);

    /**
     * 用户下单
     * @param param 下单需求
     * @return 返回确定值
     */
    Boolean createOrderByProduct(OrderProductCreateParam param);

    /**
     * 发起支付订单
     * @param orderProductNum 订单编号
     * @param userId 用户id
     * @return 支付表单
     */
    String pay(String orderProductNum, String userId) throws Exception;

    /**
     * 支付回调
     * @param params 参数
     */
    void payNotify(Map<String, String> params) throws AlipayApiException;

    /**
     * 申请退款
     * @param orderProductNum 商品订单编号
     * @return 判断
     */
    Boolean refund(String orderProductNum,String userId) throws AlipayApiException;

    /**
     * 修改订单评价状态
     * @param form
     * @return
     */
    Boolean updateReviewStateByOrderProductNum(OrderProductUpdateReviewStateForm form);

    /**
     * 确认完成订单(用户)
     * @param orderProductNum
     * @param userId
     * @return
     */
    Boolean finishOrder(String orderProductNum, String userId);

    Boolean upOrder(String orderProductNum);
}
